package com.example.design.singleton;


import java.io.Serializable;

/**
 *     双重锁检测    --解决单例模式懒汉式线程不安全问题
 */
public class Singleton4  {
    //2. 提供本类的唯一的实例作为它的静态属性
    //volatile - 禁止JVM的指令重排 - 优化

    //没有进行JVM指令重排
    //User user = new User();
    //①申请空间
    //②初始化对象 - 调用构造方法
    //③将对象的地址赋值给user

    //经过JVM的指令重排之后的顺序,实际上真正的顺序
    //①申请空间 - 地址已经出来了
    //②对象的地址赋值给user
    //③初始化对象 - 调用构造方法(消耗时间)

    public  static  volatile  Singleton4  instance;

    public  Singleton4(){
        System.out.println("构造方法。。。。。。");
    }

    public static Singleton4 getInstance() {

        if(instance==null){
            synchronized (Singleton4.class){
                if(instance==null){
                    instance=new Singleton4();
                }
            }
        }
        return instance;
    }

}

class   Single4Test{
    public static void main(String[] args) {
        Singleton4 s1=Singleton4.getInstance();
        Singleton4 s2=Singleton4.getInstance();
        System.out.println(s1==s2);
    }
}
